home *** CD-ROM | disk | FTP | other *** search
/ Aminet 2 / Aminet AMIGA CDROM (1994)(Walnut Creek)[Feb 1994][W.O. 44790-1].iso / Aminet / dev / c / RConfig.lha / RConfig_v1.1 / src / rconfig.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-09-20  |  10.1 KB  |  335 lines

  1. /*
  2.  * RConfig -- Replacement Library Configuration
  3.  *   Copyright 1992 by Anthon Pang, Omni Communications Products
  4.  *
  5.  * Source File: rconfig.c
  6.  * Description: main IDCMP loop
  7.  * Comments: main() located here
  8.  */
  9.  
  10. #include <exec/types.h>
  11. #include <exec/memory.h>
  12. #include <exec/execbase.h>
  13. #include <utility/tagitem.h>
  14. #include <dos/dos.h>
  15. #include <intuition/intuition.h>
  16. #include <libraries/gadtools.h>
  17. #include <libraries/asl.h>
  18. #include <clib/exec_protos.h>
  19. #include <clib/gadtools_protos.h>
  20. #include <clib/intuition_protos.h>
  21. #include <clib/dos_protos.h>
  22. #include <clib/asl_protos.h>
  23. #include <stdarg.h>
  24.  
  25. #include "rc2.h"                /* GUI */
  26. #include "rconfig_rev.h"        /* revision info */
  27.  
  28. static char *VERSION_TAG=VERSTAG;
  29.  
  30. /*
  31.  *  Global variables
  32.  */
  33. extern void *SysBase;
  34. extern int Enable_Abort;
  35. struct GadToolsBase     *GadToolsBase;
  36. struct GfxBase          *GfxBase;
  37. struct IntuitionBase    *IntuitionBase;
  38. struct Library          *AslBase;
  39.  
  40. struct Gadget *IObject;
  41. ULONG IClass;
  42. UWORD Code;
  43. UWORD Qualifier;
  44.  
  45. int alloca_mode=0;
  46. int setjmp_mode=0;
  47. int main_mode=0;
  48. int stkchk_mode=0;
  49.  
  50. int pathlength=0;
  51.  
  52. struct FileRequester *fr;
  53. struct TagItemA frtags[] = {
  54.     ASL_Hail,       (ULONG *)"New Output Directory",
  55.     ASL_ExtFlags1,  (ULONG *)FIL1F_NOFILES,
  56.     TAG_DONE
  57. };
  58.  
  59.  
  60. #define THRESHHOLD  2768    /* min. threshhold */
  61. #define STACKSIZE   8192    /* must be greater than threshhold */
  62. #define CONTEXTSIZE 128     /* arbitrary minimum */
  63.  
  64. int integer_mode=0;     /* 32 bits vs 16 bits */
  65. int data_mode=0;        /* small model vs large model */
  66.  
  67. #if 0     /* -ss option works */
  68. #define Say(s) Write(Output(), (char*)(s), sizeof(s))
  69. #else
  70. void Say(char s[]) { Write(Output(), (char*)(s), strlen(s)); }
  71. #endif
  72.  
  73. /* on/off is bit 0 */
  74. #define TOGGLE_SIMPLE(v)    v = (~v) & 1
  75.  
  76. /* on/off is bit 1 */
  77. #define TOGGLE_MASK(v)      v = (v & 1) | ((~v) & 2)
  78.  
  79. #define UPDATE_CYCLE(v,g)   GT_SetGadgetAttrs(RConfigGadgets[g], \
  80.       RConfigWnd, NULL, GTCY_Active, v & 1, TAG_END)
  81. #define UPDATE_TOGGLE(v,g)  GT_SetGadgetAttrs(RConfigGadgets[g], \
  82.       RConfigWnd, NULL, GTCB_Checked, v & 2 ? TRUE : FALSE, TAG_END)
  83. #define UPDATE_TOGGLE_SIMPLE(v,g)   GT_SetGadgetAttrs(RConfigGadgets[g], \
  84.       RConfigWnd, NULL, GTCB_Checked, v & 1, TAG_END)
  85.  
  86. /* cycle value is bit 0 */
  87. #define CYCLE_SIMPLE(v)     v = (~v) & 1
  88. #define CYCLE_MASK(v)       v = (v & 2) | ((~v) & 1)
  89.  
  90. #define FWDKEYCYCLE(v) if (v==3) v = 0; else if (v==2) v = 3; else v |= 2;
  91. #define RVSKEYCYCLE(v) if (v==3) v = 2; else if (v==2) v = 0; else v = 3;
  92.  
  93. extern long ReadIMsg(struct Window *iwnd);
  94. extern void ClearMsgPort(struct MsgPort *mport);
  95. extern void GenLib();
  96.  
  97. int RConfigWndProc();
  98.  
  99. void main() {
  100.     int ok=0;
  101.  
  102.     if (((struct ExecBase *)SysBase)->LibNode.lib_Version < 37) {
  103.         Say("RConfig requires Amiga OS 2.04 or above.\n");
  104.         exit(10);
  105.     }
  106.  
  107.     Enable_Abort = 0;
  108.  
  109.     GfxBase = (struct GfxBase *)OpenLibrary((UBYTE*)"graphics.library", 37l);
  110.     if (GfxBase) {
  111.         IntuitionBase = (struct IntuitionBase *)OpenLibrary((UBYTE*)"intuition.library", 37l);
  112.         if (IntuitionBase) {
  113.             GadToolsBase = (struct GadToolsBase *)OpenLibrary((UBYTE*)"gadtools.library", 37l);
  114.             if (GadToolsBase) {
  115.                 AslBase = (struct Library *)OpenLibrary((UBYTE*)"asl.library", 37l);
  116.                 if (AslBase) {
  117.                     if (fr = (struct FileRequester *)AllocAslRequest(ASL_FileRequest, (struct TagItem *)frtags)) {
  118.                         ok = RConfigWndProc();
  119.                         FreeAslRequest(fr);
  120.                     } else {
  121.                         Say("Unable to create file requester\n");
  122.                     }
  123.                     CloseLibrary((struct Library *)AslBase);
  124.                 } else {
  125.                     Say("Unable to open asl.library\n");
  126.                 }
  127.                 CloseLibrary((struct Library *)GadToolsBase);
  128.             } else {
  129.                 Say("Unable to open gadtools.library\n");
  130.             }
  131.             CloseLibrary((struct Library *)IntuitionBase);
  132.         } else {
  133.             Say("Unable to open intuition.library\n");
  134.         }
  135.         CloseLibrary((struct Library *)GfxBase);
  136.     } else {      
  137.         Say("Unable to open graphics.library\n");
  138.     }
  139.  
  140.     if (ok) ok=20;
  141.  
  142.     exit(ok);
  143. }
  144.  
  145. struct EasyStruct myAbout = {
  146.     sizeof(struct EasyStruct),
  147.     0,
  148.     (UBYTE *)"About RConfig",
  149.     (UBYTE *)"         RConfig v1.1\n\n"             \
  150.              " Replacement Library Manager\n\n"     \
  151.              "Copyright 1992 by Anthon Pang,\n"     \
  152.              " Omni Communications Products\n\n"    \
  153.              "    Freely Redistributable",
  154.     (UBYTE *)"Continue"
  155. };
  156.  
  157. int RConfigWndProc() {
  158.     int notok;
  159.     UWORD menu, item, sub, sel;
  160.     struct MenuItem *Next;
  161.  
  162.     notok = SetupScreen();
  163.     if (notok) {
  164.         Say("Unable to setup screen\n");
  165.  
  166. RConfigWndProcFail:
  167.  
  168.         CloseDownScreen();
  169.         return 1; /* error */
  170.     }
  171.  
  172.     notok = OpenRConfigWindow();
  173.     if (notok) {
  174.         Say("Unable to open window\n");
  175.  
  176. RConfigWndProcFailOther:
  177.  
  178.         CloseRConfigWindow();
  179.         goto RConfigWndProcFail;
  180.     }
  181.  
  182.     while (1) {
  183.         WaitPort(RConfigWnd->UserPort);
  184.         while(ReadIMsg(RConfigWnd)) {
  185.  
  186.             switch (IClass) {
  187.               case IDCMP_REFRESHWINDOW:
  188.                 GT_BeginRefresh(RConfigWnd);
  189.                 RConfigRender(); /* re-draw texts and boxes */
  190.                 GT_EndRefresh(RConfigWnd, TRUE);
  191.                 break;
  192.  
  193.               case IDCMP_MENUPICK:
  194.                 sel = Code;
  195.                 while (sel != MENUNULL) {
  196.                     menu = MENUNUM(Code);
  197.                     item = ITEMNUM(Code);
  198.                     sub  = SUBNUM(Code);
  199.  
  200.                     switch (menu) {
  201.                       case 0:
  202.                         switch (item) {
  203.                           case 0:
  204.                             EasyRequest(NULL, &myAbout, NULL);
  205.                             break;
  206.  
  207.                           case 2:
  208.                             if (AslRequest(fr, NULL))
  209.                                 pathlength = strlen(fr->rf_Dir);
  210.                             break;
  211.  
  212.                           case 4:
  213.                             goto RConfigQuit;
  214.                             break; /* not reached */
  215.                         }
  216.                         break;
  217.                     }
  218.                     Next = ItemAddress(RConfigMenus, (unsigned long)sel);
  219.                     sel = Next->NextSelect;
  220.                 }
  221.                 break;
  222.  
  223.               case IDCMP_CLOSEWINDOW:
  224.                 goto RConfigQuit;
  225.                 break;
  226.  
  227.               case IDCMP_GADGETUP:
  228.                 switch (IObject->GadgetID) {
  229.                   case GD_ALLOCA_CHK:
  230.                     TOGGLE_MASK(alloca_mode);
  231.                     break;
  232.                   case GD_STKCHK_CHK:
  233.                     TOGGLE_MASK(stkchk_mode);
  234.                     break;
  235.                   case GD_SETJMP_CHK:
  236.                     TOGGLE_SIMPLE(setjmp_mode);
  237.                     break;
  238.                   case GD_MAIN_CHK:
  239.                     TOGGLE_MASK(main_mode);
  240.                     break;
  241.                   case GD_ALLOCA_TYPE:
  242.                     CYCLE_MASK(alloca_mode);
  243.                     break;
  244.                   case GD_STKCHK_TYPE:
  245.                     CYCLE_MASK(stkchk_mode);
  246.                     break;
  247.                   case GD_MAIN_TYPE:
  248.                     CYCLE_MASK(main_mode);
  249.                     break;
  250.                   case GD_INTEGER_SIZE:
  251.                     CYCLE_SIMPLE(integer_mode);
  252.                     break;
  253.                   case GD_DATA_SIZE:
  254.                     CYCLE_SIMPLE(data_mode);
  255.                     break;
  256.                   case GD_CANCEL:
  257.                     goto RConfigQuit;
  258.                     break;
  259.                   case GD_GENLIB:
  260.                     GenLib();
  261.                     break;
  262.                   case GD_Flags:
  263.                     CCOPTS();
  264.                     break;
  265.                 }
  266.                 break;
  267.  
  268.               case IDCMP_VANILLAKEY:
  269.                 switch (Code) {
  270.                   case 'g':
  271.                   case 'G':
  272.                     /* flash button? */
  273.                     GenLib();
  274.                     break;
  275.                   case 'i':
  276.                   case 'I':
  277.                     CYCLE_SIMPLE(integer_mode);
  278.                     UPDATE_CYCLE(integer_mode, GD_INTEGER_SIZE);
  279.                     break;
  280.                   case 'd':
  281.                   case 'D':
  282.                     CYCLE_SIMPLE(data_mode);
  283.                     UPDATE_CYCLE(data_mode, GD_DATA_SIZE);
  284.                     break;
  285.                   case 'j':
  286.                   case 'J':
  287.                     TOGGLE_SIMPLE(setjmp_mode);
  288.                     UPDATE_TOGGLE_SIMPLE(setjmp_mode, GD_SETJMP_CHK);
  289.                     break;
  290.                   case 'a':
  291.                     FWDKEYCYCLE(alloca_mode);
  292.                     UPDATE_TOGGLE(alloca_mode, GD_ALLOCA_CHK);
  293.                     UPDATE_CYCLE(alloca_mode, GD_ALLOCA_TYPE);
  294.                     break;
  295.                   case 'A':
  296.                     RVSKEYCYCLE(alloca_mode);
  297.                     UPDATE_TOGGLE(alloca_mode, GD_ALLOCA_CHK);
  298.                     UPDATE_CYCLE(alloca_mode, GD_ALLOCA_TYPE);
  299.                     break;
  300.                   case 'm':
  301.                     FWDKEYCYCLE(main_mode);
  302.                     UPDATE_TOGGLE(main_mode, GD_MAIN_CHK);
  303.                     UPDATE_CYCLE(main_mode, GD_MAIN_TYPE);
  304.                     break;
  305.                   case 'M':
  306.                     RVSKEYCYCLE(main_mode);
  307.                     UPDATE_TOGGLE(main_mode, GD_MAIN_CHK);
  308.                     UPDATE_CYCLE(main_mode, GD_MAIN_TYPE);
  309.                     break;
  310.                   case 's':
  311.                     FWDKEYCYCLE(stkchk_mode);
  312.                     UPDATE_TOGGLE(stkchk_mode, GD_STKCHK_CHK);
  313.                     UPDATE_CYCLE(stkchk_mode, GD_STKCHK_TYPE);
  314.                     break;
  315.                   case 'S':
  316.                     RVSKEYCYCLE(stkchk_mode);
  317.                     UPDATE_TOGGLE(stkchk_mode, GD_STKCHK_CHK);
  318.                     UPDATE_CYCLE(stkchk_mode, GD_STKCHK_TYPE);
  319.                     break;
  320.                 }
  321.                 break;
  322.             }
  323.         }
  324.     }
  325.  
  326. RConfigQuit:
  327.     ClearMsgPort(RConfigWnd->UserPort);
  328.  
  329.     CloseRConfigWindow();
  330.  
  331.     CloseDownScreen();
  332.  
  333.     return 0;
  334. }
  335.